package com.wei.czz.framework.blog.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.blog.audit.groupUser.BlogAuditGroupUserListDto;
import com.wei.czz.common.jsr303.group.Search;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.audit.groupUser.BlogAuditGroupUserFormVo;
import com.wei.czz.common.vo.blog.audit.groupUser.BlogAuditGroupUserVo;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.framework.blog.manager.BlogAuditGroupUserManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import lombok.AllArgsConstructor;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2024-12-05 08:22:00
 * className: BlogAuditGroupUserController
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/blog/audit/group/user")
@AllArgsConstructor
public class BlogAuditGroupUserController {

    private static final Logger log = LoggerFactory.getLogger(BlogAuditGroupUserController.class);

    private final BatchProperty batchProperty;

    private final BlogAuditGroupUserManager blogAuditGroupUserManager;

    /**
     * 保存博客审核分组用户接口
     * <p>
     * 调用方：
     *   1、浏览器-后台管理页面-博客审核分组管理页面-博客审核分组用户管理抽屉中调用
     * <p>
     * 此接口会校验是否重复提交，重复提交限制条件为审核分组主键
     * @param vo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'saveBlogAuditGroupUser' + #vo.groupId", message = "保存博客审核分组用户")
    @PostMapping("/save")
    @Auth(permit = "blog:audit:group:user:save")
    public Result<Object> saveBlogAuditGroupUser(@Validated @RequestBody BlogAuditGroupUserVo vo) {
        log.info("开始保存博客审核分组用户业务。{}", vo);

        blogAuditGroupUserManager.saveBlogAuditGroupUser(vo);

        log.info("保存博客审核分组用户业务结束");
        return Result.success();
    }

    /**
     * 分页获取博客审核分组用户接口
     * <p>
     * 调用方：
     *   1、浏览器-后台管理页面-博客审核分组管理页面-博客审核分组用户管理抽屉中调用
     * @param formVo 参数对象
     * @return 结果
     */
    @PostMapping("/page/list")
    @Auth(permit = "blog:audit:group:user:list")
    public Result<PageDto<BlogAuditGroupUserListDto>> getBlogAuditGroupUserPageList(
            @Validated(Search.class) @RequestBody BlogAuditGroupUserFormVo formVo) {
        log.info("开始分页查询博客审核分组用户业务。{}", formVo);

        PageDto<BlogAuditGroupUserListDto> pageDto = blogAuditGroupUserManager.getBlogAuditGroupUserPageList(formVo);

        log.info("分页查询博客审核分组用户业务结束");
        return Result.success(pageDto);
    }

    /**
     * 更新博客审核分组用户状态接口
     * <p>
     * 调用方：
     *   1、浏览器-后台管理页面-博客审核分组管理页面-博客审核分组用户管理抽屉中调用
     * @param updateStatusVo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'updateBlogAuditGroupUserStatus' + #userId", message = "更新博客审核分组用户状态")
    @PostMapping("/update/status")
    @Auth(permit = "blog:audit:group:user:update")
    public Result<Object> updateBlogAuditGroupUserStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始更新博客审核分组用户状态业务。{}", updateStatusVo);

        List<Long> idList = updateStatusVo.getIdList();
        if (batchProperty.getMaxSize() < idList.size()) {
            log.warn("修改博客审核分组用户状态数量超限。batch.maxSize={} list.size={}", batchProperty.getMaxSize(), idList.size());
            return Result.clientFail("一次修改博客审核分组用户状态最多可以同时" + batchProperty.getMaxSize() + "条数据");
        }

        blogAuditGroupUserManager.updateBlogAuditGroupUserStatus(updateStatusVo);

        log.info("更新博客审核分组用户状态业务结束");
        return Result.success();
    }

    /**
     * 更新博客审核用户配置自动领单状态接口
     * <p>
     * 调用方：
     *   1、浏览器-后台管理页面-博客审核分组管理页面-博客审核分组用户管理抽屉中调用
     * @param updateStatusVo 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'updateBlogAuditUserAutoClaimStatus' + #userId", message = "更新博客审核用户配置自动领单状态")
    @PostMapping("/update/auto/claim/status")
    @Auth(permit = "blog:audit:group:user:update")
    public Result<Object> updateBlogAuditUserAutoClaimStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始更新博客审核用户配置自动领单状态业务。{}", updateStatusVo);

        List<Long> idList = updateStatusVo.getIdList();
        if (batchProperty.getMaxSize() < idList.size()) {
            log.warn("修改博客审核用户配置自动领单状态数量超限。batch.maxSize={} list.size={}", batchProperty.getMaxSize(), idList.size());
            return Result.clientFail("一次修改博客审核用户配置自动领单状态最多可以同时" + batchProperty.getMaxSize() + "条数据");
        }

        blogAuditGroupUserManager.updateBlogAuditUserAutoClaimStatus(updateStatusVo);

        log.info("更新博客审核用户配置自动领单状态业务结束");
        return Result.success();
    }

    /**
     * 打乱博客审核分组用户排序等级接口
     * <p>
     * 调用方：
     *   1、浏览器-后台管理页面-博客审核分组管理页面-博客审核分组用户管理抽屉中调用
     * @param groupId 博客审核分组主键
     * @return 结果
     */
    @Resubmit(spEL = "'shuffleBlogAuditGroupUser' + #groupId", message = "打乱博客审核分组用户排序等级")
    @PostMapping("/shuffle")
    @Auth(permit = "blog:audit:group:user:update")
    public Result<Object> shuffleBlogAuditGroupUser(@RequestParam("groupId") Long groupId) {
        log.info("开始打乱博客审核分组用户排序等级业务。groupId={}", groupId);

        blogAuditGroupUserManager.shuffleBlogAuditGroupUser(groupId);

        log.info("打乱博客审核分组用户排序等级业务结束");
        return Result.success();
    }

    /**
     * 删除博客审核分组用户接口
     * <p>
     * 调用方：
     *   1、浏览器-后台管理页面-博客审核分组管理页面-博客审核分组用户管理抽屉中调用
     * @param idList 参数对象
     * @return 结果
     */
    @Resubmit(spEL = "'deleteBlogAuditGroupUser' + #userId", message = "删除博客审核分组用户")
    @DeleteMapping("/delete")
    @Auth(permit = "blog:audit:group:user:delete")
    public Result<Object> deleteBlogAuditGroupUser(@RequestBody List<Long> idList) {
        log.info("开始删除博客审核分组用户业务。idList={}", idList);

        if (idList.isEmpty()) {
            return Result.clientFail("主键列表不能为空");
        }
        if (batchProperty.getMaxSize() < idList.size()) {
            log.warn("删除博客审核分组用户数量超限。batch.maxSize={} list.size={}", batchProperty.getMaxSize(), idList.size());
            return Result.clientFail("一次删除博客审核分组用户最多可以同时" + batchProperty.getMaxSize() + "条数据");
        }

        blogAuditGroupUserManager.deleteBlogAuditGroupUser(idList);

        log.info("删除博客审核分组用户业务结束");
        return Result.success();
    }

}
